package actions;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map.Entry;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import donnees.Produit;

import metier.client.MetierFactory;
import metier.interfaces.IRemotePanier;

public class ActionPanier implements IAction {

	@Override
	public String execute(HttpServletRequest req) throws Exception {

		String jsp = "panier.jsp";

		// récupération de la session
		HttpSession session = req.getSession();

		// récupération du metier distant
		IRemotePanier metierPanier = (IRemotePanier) MetierFactory
				.getInstance().getMetier("Panier");

		// récupération du panier
		HashMap<Integer, Integer> panier = (HashMap<Integer, Integer>) session
				.getAttribute("panier");

		// Commande lancée ?
		if (req.getParameter("commander") != null) {

			/* tester si utilisateur connecté */

			if (session.getAttribute("id_client") == null) {
				jsp = "connexion";
				session.setAttribute("provenance", "panier");
			} else {

				if (session.getAttribute("panier") != null) {

					/* filtrer quantitées */
					boolean qtesValides = true;
					Integer qte = 0;
					for (Integer id : panier.keySet()) {

						if (req.getParameter("qte_" + id) != null) {
							try {
								qte = Integer.parseInt(req.getParameter("qte_"
										+ id));
								panier.put(id, qte);
							} catch (NumberFormatException e) {
								qtesValides = false;
							}
						} else {
							qtesValides = false;
						}
					}

					// Lancer la commande
					if (qtesValides) {
						boolean res = metierPanier.commander(panier,
								(Integer) session.getAttribute("id_client"));
						if (res) {
							panier.clear();
							session.setAttribute("panier", panier);
						}
						req.setAttribute("commandeok", res);
					} else {
						req.setAttribute("commandeok", false);
						req.setAttribute("erreur", "Erreur : Quantité invalide");
					}
				}

			}

		}

		// Récupération info tableau panier
		if (session.getAttribute("panier") != null) {

			Collection<Produit> produits = metierPanier
					.getLesProduitsPanier(this.getIdProduitsPanier(panier));

			req.setAttribute("produits", produits);
		} else {
			// panier vide
			req.setAttribute("produits", new ArrayList<Produit>());
		}

		return jsp;
	}

	/*
	 * hashmap values() not serializable : récreer collection des id produit du
	 * panier manuellement
	 */
	public Collection<Integer> getIdProduitsPanier(
			HashMap<Integer, Integer> panier) {

		Collection<Integer> idProduits = new ArrayList<Integer>();
		for (Integer p : panier.keySet()) {
			idProduits.add(p);
		}
		return idProduits;
	}

}
